import java.util.concurrent.Executors;
import java.util.concurrent.LinkedBlockingDeque;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;

/**
 * @Author: tgy
 * @Date: 2020-07-29 11:27
 */
/**
 * 线程池执行逻辑
 * 1. 创建 coreThreadPoolSize 个线程
 * 2.如果执行的任务大于 coreThreadPoolSize，则把任务添加到 blockingQueue中
 * 3. 如果blockingQueue 队列满了，则把线程夸大到 maxinumThreadPoolSize，然后取出blockQueue中的任务执行，
 * 4.如果这时 blockingQueue还是满了，则执行指定的拒绝策略
 *      4.1拒绝策略
 *          AbortPolicy:继续添加任务，则抛出异常
 *          DiscardPolicy: 默默的抛弃任务
 *          DiscardOldestPolicy: 抛出之前最先添加的任务
 *          CallerRunsPolicy: 把任务放到线程池调用线程执行
 *
  */

public class ThreadPoolTest {

    public static void main(String[] args) {

        ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(2,
                5,
                10,
                TimeUnit.SECONDS,
                new LinkedBlockingDeque<>(3),
                Executors.defaultThreadFactory(),
                new ThreadPoolExecutor.DiscardOldestPolicy()
        );
        // 使用 默认的系统线程池，由于系统线程的 BlockingQueue容量使用的是 Integer.MAX，到并发非常大的时候，容易出现OOM(Out Of Memory)
//        Executors.newFixedThreadPool(4);

        for (int i = 0; i < 100; i++) {
            final  int j = i;
            threadPoolExecutor.execute(()->{

                System.out.println(Thread.currentThread().getName() + " i = " + j);

            });
        }

        threadPoolExecutor.shutdown();
    }
}
